feat(auth): add Kimi and Xiaomi MiMo providers - #8368
Conversation
E2E Test ReportEnvironment
BaselineThe globally installed Qwen Code 0.21.3 did not expose Kimi or Xiaomi MiMo under Post-change result
Result✅ Passed on macOS. |
|
Re-run gate at Template: looks good ✓ Problem: real user friction, not a theoretical concern — Kimi and Xiaomi MiMo users had to hand-recreate these endpoints through Custom Provider, and Kimi's Coding Plan vs regional APIs use different credential variables and different model catalogs, so a flat preset would install invalid models for some endpoints. The pagination fix addresses a real clipping bug: the maintainer reproduced the corruption on the base build at 100×24 and confirmed the fix on this PR's build. Direction: aligned. First-class third-party presets are an established pattern here — the CHANGELOG records "Added xAI Grok as a built-in model provider preset" (#6805) alongside DeepSeek, MiniMax, ModelScope and others. Extending the existing preset seam to carry endpoint-specific metadata is the minimal way to express subscription-scoped endpoints. Size: core provider paths touched across seven packages. ~1,850 production-logic lines vs ~5,750 test lines (~1:3 ratio), ~75 doc lines, ~3 CI lines. That is far past the 500-line core threshold, so the Stage 0 maintainer-awareness escalation applies; it has been thoroughly exercised — 20 review rounds, a takeover loop, and maintainer live verification ending in an approval at this commit. The 1000+ line large-PR advisory applies too, but splitting an already-converged review would cost more than it saves — informational only. Approach: the endpoint metadata rides on the existing preset seam ( Risk: Moving on to code review. 🔍 中文说明在 **模板:**完整 ✓ **问题:**真实用户摩擦,不是理论问题——Kimi 和 Xiaomi MiMo 用户此前必须通过 Custom Provider 手工重建这些 endpoint,且 Kimi 的 Coding Plan 与区域 API 使用不同的凭据变量和模型目录,扁平预设会为部分 endpoint 装入无效模型。分页修复针对的是真实的裁剪 bug:维护者在 base 版本上于 100×24 复现了串行,并确认本 PR 已修复。 **方向:**对齐。一等第三方预设是既有模式——CHANGELOG 中有"Added xAI Grok as a built-in model provider preset"(#6805),以及 DeepSeek、MiniMax、ModelScope 等先例。在既有预设接缝上扩展 endpoint 级元数据,是表达订阅制 endpoint 的最小方式。 **规模:**触及七个包的核心 provider 路径。生产逻辑约 1,850 行,测试约 5,750 行(约 1:3),文档约 75 行,CI 约 3 行。远超 500 行核心阈值,Stage 0 维护者知悉升级适用且已被充分执行——20 轮评审、takeover 循环、维护者真机验证,最终在本 commit 上给出 approval。1000+ 行大 PR 提示同样适用,但此时拆分已收敛的评审得不偿失——仅作信息提示。 **方案:**endpoint 元数据走既有预设接缝( 风险: 进入代码审查。🔍 — Qwen Code · qwen3.8-max Reviewed at |
Code review (re-run at
|
| File | What changed |
|---|---|
packages/core/src/providers/types.ts |
BaseUrlOption gains optional per-endpoint models; install patch gains cross-endpoint retain/own fields |
packages/core/src/providers/presets/kimi.ts |
New preset: Coding Plan plus China and International API endpoints with per-endpoint models, env keys, doc links |
packages/core/src/providers/presets/xiaomi-mimo.ts |
New preset: pay-as-you-go plus three Token Plan endpoints sharing one model list |
packages/core/src/providers/provider-config.ts |
resolveProviderModels, endpoint-scoped metadata keys, template-based version hash, exported baseUrl normalization |
packages/core/src/providers/install.ts |
Endpoint-safe merge: replace in place at the first removed slot; keep the current model across sibling endpoints |
packages/core/src/providers/all-providers.ts |
Registers the two providers; third-party list sorted by label |
packages/core/src/providers/index.ts |
Exports the new presets and resolvers |
packages/core/src/providers/presets/alibaba-coding-plan.ts |
Opts into identity merge so both regions share one auth type safely |
packages/core/src/providers/presets/alibaba-token-plan.ts |
Same opt-in for the Token Plan regions |
packages/core/src/telemetry/gen-ai-provider.ts |
Recognizes the new endpoints for telemetry labels, with attacker-domain guard tests |
packages/cli/src/ui/auth/AuthDialog.tsx |
Height-based list pagination with scroll arrows; endpoint-scoped restore of saved setup |
packages/cli/src/ui/auth/useProviderSetupFlow.ts |
Endpoint switching preserves key drafts, custom-model provenance and per-endpoint trimmed defaults |
packages/cli/src/ui/auth/ProviderSetupSteps.tsx |
Model step options follow the selected endpoint; protocol step restores the saved protocol |
packages/cli/src/ui/hooks/useProviderUpdates.ts |
Per-endpoint update targets, one-time legacy-key migration, endpoint-scoped re-install and re-auth guard |
packages/cli/src/ui/components/ProviderUpdatePrompt.tsx |
Labels each endpoint section; metadataKey as the React key |
packages/cli/src/ui/components/DialogManager.tsx |
Passes available terminal height into the auth dialog |
packages/cli/src/ui/components/shared/DescriptiveRadioButtonSelect.tsx |
Truncates long descriptions instead of wrapping |
packages/cli/src/serve/server/auth-provider-helpers.ts |
Catalog carries per-option envKey and models; a throwing provider degrades only itself |
packages/cli/src/serve/run-qwen-serve.ts |
Install requests default to the endpoint-specific model IDs |
packages/cli/src/acp-integration/acpAgent.ts |
Seeds modelIds scoped to the restored endpoint; exposes modelIdsByBaseUrl; hasApiKey instead of key values |
packages/vscode-ide-companion/src/services/settingsWriter.ts |
Sign-out clears function-derived env keys and endpoint-suffixed metadata keys |
packages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.ts |
Models step seeded with endpoint defaults plus restored custom models |
packages/web-shell/client/components/messages/AuthMessage.tsx |
Per-endpoint env key, models and doc link; modelsDirty guards user edits across endpoint switches |
packages/web-shell/client/components/messages/auth-provider-state.ts |
Pure endpoint-state helpers, fully unit tested |
packages/desktop/apps/electron/src/renderer/components/apisetup/provider-state.ts |
Desktop twin of the endpoint-state helpers, fully unit tested |
packages/desktop/apps/electron/src/renderer/components/apisetup/ProviderConnectForm.tsx |
Wires endpoint switching and model editing through provider-state |
packages/desktop/packages/shared/src/protocol/dto.ts |
Wire types gain per-option envKey/models; existingConfig.apiKey replaced by hasApiKey |
docs/design/kimi-xiaomi-auth-providers.md |
Design doc with model metadata rationale and sources |
.github/workflows/ci.yml |
Scrubs the three new env keys in the no-AK integration job |
| …and 24 more files | Unit/integration tests (~5,750 lines) covering everything above, plus doc and SDK-type updates |
Testing
CI evidence (this commit's own runs, via API — no PR code was executed by triage):
| Check | Conclusion |
|---|---|
| Test (ubuntu-latest, Node 22.x) | ✅ success |
| Test (macos-latest, Node 22.x) | ⏭️ skipped — merge-queue-only job (event_name == 'merge_group'), skipped on every PR |
| Test (windows-latest, Node 22.x) | ⏭️ skipped — merge-queue-only job, same reason |
| Integration Tests (CLI, No Sandbox) | ⏭️ skipped — merge-queue-only job, same reason |
| Desktop Shell (ubuntu-22.04) | ✅ success |
| Desktop Shell (windows-2022) | ✅ success |
| web-shell E2E Smoke (ubuntu-latest, Node 22.x) | ✅ success |
| Serve A/B (ubuntu-latest, Node 22.x) | ✅ success — no response changes vs the PR base across 4 scenarios |
| Capture web-shell visuals | ✅ success |
| Live Host (macos-latest) | ✅ success |
| Real daemon E2E (SDK Java) | ✅ success |
| precheck-pr / precheck | ✅ success |
All pull_request-event workflow runs on this commit are complete; nothing is pending. The three skipped test jobs are merge-queue-only by workflow design, not a gap in this PR. Not verified by triage: the macOS/Windows platform legs and the integration suite never run at PR stage for any PR — they will run in the merge queue.
Behavioural claims. The central claims are behavioural (endpoint routing, per-endpoint model lists, migration of existing installs), and they were verified on this exact head by the maintainer's real-environment report above in this thread: live CLI TUI + qwen serve + Web Shell against the real Kimi/MiMo endpoints, per-endpoint 401 wire proof, and an Alibaba-legacy upgrade path that migrated with a byte-identical result. That is maintainer evidence, not something this triage run re-executed — unattended CI never runs PR code. The sandboxed verification run triggered by the same command (run 31608893329) is still in flight and will post its own report here; if a bot-driven TUI capture is also wanted, a maintainer can trigger the isolated @qwen-code /tmux job.
中文说明
代码审查(在 3c2c1331 上重新执行)
**独立方案:**读 diff 之前我会这样做:按既有预设模式新增两个 preset 文件;由于 Kimi 的三种接入方式与 MiMo 的四个 endpoint 需要不同的 base URL、env key 和模型目录,在 BaseUrlOption 上增加可选的 endpoint 级 models,并加一个 (provider, baseUrl) → models 的 resolver;把 providerMetadata key 按 endpoint 分隔以免互相覆盖,并为已有预设保留旧 key 回退;把元数据贯通 serve/ACP/VS Code/web-shell/desktop;修复列表高度分页。
**对比:**PR 的实现与这个方案几乎完全一致,并在关键处做得更深:resolveProviderModels + BaseUrlOption.models 作为接缝;resolveMetadataKey 增加稳定的 provider--endpoint 后缀(并转义 . 防止点路径写入);version 哈希改为跟踪 provider 内置模板而非用户选择,取消勾选默认模型不会再反复触发更新提示;applyModelProvidersPatch 在首个被移除位置原位替换而不是前置,重提一个 endpoint 不会静默重排或删除兄弟 endpoint。密钥处理也顺带收紧:ACP/桌面的 wire 类型把可序列化的 existingConfig.apiKey 换成布尔 hasApiKey;serve 目录按 provider 降级(抛错的推导只影响该 provider 自身)。
**Critical 阻断项:未发现。**本 head 已吸收 20 轮评审;第 19 轮 Critical 已在 f9d446f8 修复,重复 import 的 CI 问题已在 3c2c1331 修复。
非阻断观察:
- 第 20 轮仍有 6 条 Suggestion 未处理(均为 S 级)。20 轮之后按反膨胀原则应转入后续 issue,而不是再来一轮。其中较实质的两条:
AuthDialog的 endpoint 恢复边界情形(无baseUrl的已存模型并入恢复的 endpoint;已存 baseUrl 不匹配任何内置选项时回退到 provider 全量默认——不丢数据,只是粗粒度);以及桌面与 web-shell 两个包中几乎重复的 endpoint 状态助手函数(分属不同包、wire 类型不同,目前难以共享)。 kimi.ts中 endpoint 文档 URL 同时出现在baseUrl选项和顶层documentationUrl函数里——无害,但函数可以直接查选项,保持单一来源。- 建议单独开 issue 跟进(均经维护者验证确认):
ModelIdsStep在约 30 行以下的终端仍会裁剪——已有问题,base 版本同样复现;迁移到 endpoint 后缀 key 后旧providerMetadata.<id>key 会残留——无害,多 endpoint provider 不再读取。
测试
**CI 证据(本 commit 自己的运行,经 API 获取——triage 未执行任何 PR 代码):**见上方英文表格。所有 pull_request 事件的工作流运行均已完成,无 pending。三个 skipped 的测试 job 是工作流设计上仅在 merge queue 运行,不是本 PR 的缺口。triage 未验证:macOS/Windows 平台腿和集成套件在任何 PR 阶段都不运行,将在 merge queue 中执行。
**行为性声明。**核心声明是行为性的(endpoint 路由、endpoint 级模型列表、存量安装迁移),且已由维护者在本帖上方的真实环境报告中于本 head 上验证:真实 CLI TUI + qwen serve + Web Shell 对接真实 Kimi/MiMo endpoint、按 endpoint 区分的 401 wire 证明、以及逐字节一致的 Alibaba 旧版升级路径。那是维护者的证据,不是本次 triage 运行重新执行的——无人值守 CI 从不运行 PR 代码。由同一命令触发的沙箱验证运行(run 31608893329)仍在进行,完成后会在此发布报告;如还需要机器人驱动的 TUI 抓取,维护者可触发隔离的 @qwen-code /tmux job。
— Qwen Code · qwen3.8-max
Reviewed at 3c2c1331aeae2b0f1dee44861801628d942f6207 · re-run with @qwen-code /triage
|
Confidence: 3/5 — clean re-review at Stepping back: the implementation matches or exceeds my independent proposal at every point, the test-to-production ratio is roughly 3:1, and the design chose the hard-but-right options — template-based version hashes, endpoint-scoped ownership, in-place merge positions, ⏸️ Deferring to @wenshao — policy cap, no code blockers. Because Stage 0 escalated this PR for maintainer awareness, the triage gate does not approve it regardless of how clean the stages look; the merge decision stays human. Concretely, two housekeeping items stand between this PR and merge:
If it were my call on the code alone, this would be a 4/5 approve — the two held-back points are the policy cap and the open Suggestions backlog, neither of which reflects doubt about what is on this commit. 中文说明置信度:3/5 —— 在 退一步看整体:实现在每一点上都达到或超过我的独立方案,测试与生产代码比例约 3:1,设计上选择了难但正确的选项——基于模板的 version 哈希、endpoint 级 ownership、原位合并位置、wire 上用 ⏸️ **转交 @wenshao —— 政策封顶,无代码阻断项。**由于 Stage 0 已将本 PR 升级为维护者知悉,无论各阶段多干净,triage 门禁都不会批准它;合并决定保留给人类。具体来说,合并前有两件事需要处理:
如果只看代码本身,我会给 4/5 并批准——保留的两点是政策封顶和未处理的 Suggestion 积压,两者都不代表对本 commit 内容的疑虑。 — Qwen Code · qwen3.8-max Reviewed at |
🖼️ web-shell visual previewRendered against a mock daemon (no real backend): the PR base vs this PR head Screenshots · before / afterFull-resolution recordings (.webm) are attached to the workflow run. — Qwen Code · web-shell visuals |
🩺 serve daemon A/BBuilt the PR base vs this PR head ✅ No response changes against the PR base across 12 scenario(s). — Qwen Code · serve A/B |
Review:
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
中文说明
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
— qwen3.8-max-preview via Qwen Code /review
…t it A mutant or hunk whose own collocated test was not green in the unmutated baseline is held `inconclusive` -- correctly, since the other probes passing shows only that THEY do not cover it. But both guards then named a cause they had not measured: "likely a compile or import error in the probe tree". There are two ways a probe is not green and they are different failures with different fixes. Measured on PR #8368: `AuthDialog.test.tsx` compiled fine, collected 26 tests and failed exactly one, and all three mutants in its source were held with the import-error wording -- sending a reader after a problem that was never there. The baseline had already classified it `gated` (a real assertion failure) rather than `inconclusive` (collected nothing); the guards just did not look. Both now build their detail from one exported function that reads the verdict off the baseline, so the two sentences cannot drift apart again and what the tests pin is the string the report carries. A probe with no baseline entry takes the collected-nothing wording: absent is an evidentiary hole, never the claim that its tests failed.
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
中文说明
已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
— qwen3.8-max-preview via Qwen Code /review (v0.21.3)
Review round 2:
|
… them The hold landed downstream of the thing it exists to correct. In the skill's order `compose-review` ran first, so a Critical held back afterwards reached only the Step 8 report: the verdict line, the drafted `**[Critical]**` marker and the payload `submit` recounts were all fixed before the measurement was consulted. That is the exact path the #8368 misattribution took into a composed review, and this change had not closed it. The findings artifact is now written before the verdict, and a hold arriving later is named as the comment-set change it is. `heldByMeasurement` did not survive `--input`. `validateFindings` builds from a whitelist and never copied it, so the field a later round was supposed to read lasted exactly one command and `counts.held` fell back to zero -- the same invariant `outcomeNote` was added a few lines above to satisfy. `locations[].file` left the haystack, for a sharper version of the reason `suggestedFix` did. A finding ABOUT a test's content carries that test as its location, and a PR touching an already-red test is precisely when such a finding is written; demoting it uses the measurement against a claim the measurement does not address. The no-`entries` fallback is gone. It qualified nothing, so it put back the bare workspace-relative path that matches inside any package -- the collapse `repoRelative` exists to stop, through the one door left open. And only a `shared` path is reported as set aside: a `netNew` path was never eligible to hold anything back, so calling it ignored coverage was noise on the very shape that produces most keyed entries.
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
中文说明
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
— qwen3.8-max-preview via Qwen Code /review (v0.21.3)
…holds Three rounds of self-review over the diff. A finding a later round re-files as Critical was held again and gained a second, identical explanation -- two paragraphs under one finding read as two measurements, and the round ledger carrying a held finding forward is exactly the path the structured field was added for. `heldByMeasurement` round-trips now, so the state to decide this on is already there: lower it again, append nothing. Moving this section ahead of the verdict was necessary and not sufficient. `compose-review` reads `comments.json` and `compose.json`, both hand-written, so a severity lowered here still ships as `**[Critical]**` if the marker was copied from the draft rather than the artifact. The skill now says to read `severity` out of `findings.json` for every marker and body Critical, which is what actually closes the path #8368 took. And two of its own claims were wrong: "the blocks above already do" named one block with the other still below it in Step 6B, and "Six test paths ... exist under BOTH packages" is five -- a number carried over from a review comment without being counted, in a change about not stating what nothing checked.
`test-delta` reruns the PR side's failed test commands on the merge base and splits the failures into the PR's own (`netNew`) and pre-existing (`shared`). Nothing then read that split back. A Critical asserting "this PR breaks test X" could name a file the same run had just measured as failing without the PR, and the two artifacts never met. Measured on #8368: `AuthDialog.test.tsx` came back `shared` in two independent runs, and the merge base e967cc9 fails the very same test -- `drives API key provider steps from endpoint options metadata`. A Critical reading "height-based pagination breaks the pre-existing test" was carried across four rounds into the composed review anyway. It only escaped posting because the PR's head had moved. The path rule this misattribution used to come through was closed inside `test-delta`; the round ledger is the other door. `findings --test-delta` now holds such a Critical back to Suggestion and names the finding and the file on stderr. Downgrade, never drop: the measurement contradicts the severity, not necessarily the observation, since a test can be red for two reasons at once. The finding keeps its own evidence, gains the measurement that demoted it, and stays in front of a human who can restore it by naming which test fails for a new reason and quoting both sides. Both `review findings` invocations in the skill pass the flag. The second one rebuilds the artifact from the same input, so leaving it off there would have restored every Critical the first had just held back.
… them The hold landed downstream of the thing it exists to correct. In the skill's order `compose-review` ran first, so a Critical held back afterwards reached only the Step 8 report: the verdict line, the drafted `**[Critical]**` marker and the payload `submit` recounts were all fixed before the measurement was consulted. That is the exact path the #8368 misattribution took into a composed review, and this change had not closed it. The findings artifact is now written before the verdict, and a hold arriving later is named as the comment-set change it is. `heldByMeasurement` did not survive `--input`. `validateFindings` builds from a whitelist and never copied it, so the field a later round was supposed to read lasted exactly one command and `counts.held` fell back to zero -- the same invariant `outcomeNote` was added a few lines above to satisfy. `locations[].file` left the haystack, for a sharper version of the reason `suggestedFix` did. A finding ABOUT a test's content carries that test as its location, and a PR touching an already-red test is precisely when such a finding is written; demoting it uses the measurement against a claim the measurement does not address. The no-`entries` fallback is gone. It qualified nothing, so it put back the bare workspace-relative path that matches inside any package -- the collapse `repoRelative` exists to stop, through the one door left open. And only a `shared` path is reported as set aside: a `netNew` path was never eligible to hold anything back, so calling it ignored coverage was noise on the very shape that produces most keyed entries.
…holds Three rounds of self-review over the diff. A finding a later round re-files as Critical was held again and gained a second, identical explanation -- two paragraphs under one finding read as two measurements, and the round ledger carrying a held finding forward is exactly the path the structured field was added for. `heldByMeasurement` round-trips now, so the state to decide this on is already there: lower it again, append nothing. Moving this section ahead of the verdict was necessary and not sufficient. `compose-review` reads `comments.json` and `compose.json`, both hand-written, so a severity lowered here still ships as `**[Critical]**` if the marker was copied from the draft rather than the artifact. The skill now says to read `severity` out of `findings.json` for every marker and body Critical, which is what actually closes the path #8368 took. And two of its own claims were wrong: "the blocks above already do" named one block with the other still below it in Step 6B, and "Six test paths ... exist under BOTH packages" is five -- a number carried over from a review comment without being counted, in a change about not stating what nothing checked.
|
Qwen Code review did not complete successfully. The review pipeline failed before a review could be posted. A transient error is retried automatically; if you are seeing this, retry with |
… dialog routes The non-merge branches (minimax/zai/alibaba-standard shape: array baseUrl, shared static env key, no mergeModelsByIdentity) stamped/dropped baseUrl-less legacy entries without consulting legacyEnvKeyAttribution — the fail-closed gate the merge branch enforces (R41-4). A connect at one endpoint deleted (explicit selection) or re-homed (implicit reconnect) another endpoint's untouchable entries, since non-merge install plans carry the UNSCOPED ownsModel predicate. - serve/ACP non-merge branches: carry entries with !namesSelectedEndpoint && namesSiblingEndpoint through UNSTAMPED so they are written back byte-identical (R43-1/R43-2). - serve non-merge branch: drop the requestedIds gate — the serve catalog exposes no existingConfig, so absence from an explicit modelIds selection is not deselection intent (R42-1 rationale); a defaults-only Web Shell/SDK reconnect no longer deletes same-endpoint stamped customs (R43-4). The ACP twin keeps its informed-deselection gate (its route seeds existingConfig). - AuthDialog: extract one shared computePreservedModels helper for the two verbatim-twin flatMaps (getExistingProviderSetup + getProtocolSetups); seed baseUrl-less ids stamped only when namesSelectedEndpoint holds, emit them as migratedLegacyModelIds (plumbed through start()/protocol swap/ buildCurrentInputs) so stored originals collapse instead of duplicating; shared/sibling keys unseeded everywhere, carried unstamped for non-merge providers; gate the models-field seed lists identically (R43-3). Negative-controlled: all new regression tests fail on the pre-fix tree.
|
Round 43 — all 4 [Critical] findings verified against the code and confirmed real. All fixed in All four are the same defect family the merge branch already gates: the non-merge code paths (and the Negative controls first: all new regression tests fail on the pre-fix tree exactly as the probes predict, then pass with the fixes.
Tests (all negative-controlled): serve e2e minimax explicit+implicit arms through Verification: negative controls first — all 9 new tests fail on the pre-fix tree exactly as the probes predict, then pass with the fixes. Full regression: run-qwen-serve 280/280, acpAgent 472/472 (incl. a new One observed residual (not reported this round, recorded for the next review pass): the VS Code companion's |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Unresolved, please confirm:
- [Critical] 129 blocker threads from rounds 1-42 (2026-08-02 to 2026-08-22) could not be individually re-traced against this head within this round's time budget; the same-day round-43 re-check (2026-08-23) re-asserted none of them and all of their anc…
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
Not explored to full depth (tool budget reached): "agent invariant-a (packages/core/src/providers/provider-con…": none — no check was cut short.; chunk 10: did not execute the new tests — the review worktree has no node_modules (and no built dist/ ), and a full npm ci + workspace build + vitest run exceeded th…; chunk 35: none — no checks were cut short..
Not reviewed: reverse audit — stopped before round 3 by the review time budget.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 44, not a blocker) — recorded, not requested in this round:
packages/desktop/apps/electron/src/renderer/components/apisetup/provider-state.ts:24 — [review] desktop stripUserInfo normalizes https://@example.com differently from the CLI producer sanitizeProviderBaseUrlpackages/web-shell/client/components/messages/AuthMessage.tsx:205 — [review] startProvider keeps the previous provider's models when the descriptor baseUrl is an empty arraypackages/cli/src/serve/run-qwen-serve.ts:6242 — [review] serve installAuthProvider existingModels wiring has no route-level testpackages/core/src/providers/__tests__/install.test.ts:1088 — [review] R38-3 test fixture key names no endpoint — sibling-attribution branch never exercisedpackages/desktop/apps/electron/src/renderer/components/apisetup/provider-state.test.ts:1 (+2 locations) — [test] new desktop bun test suites run on no PR-gated CI jobpackages/core/src/providers/__tests__/install.test.ts:713 — [probe] test leaks process.env[TOKEN_PLAN_ENV_KEY] (no try/finally cleanup)packages/cli/src/acp-integration/acpAgent.test.ts:432 — [review] shared kimi mock has 2 endpoints — shared-MOONSHOT_API_KEY fail-closed branch unexercisedpackages/cli/src/acp-integration/acpAgent.test.ts:13232 — [review] ACP sibling-exclusion test cannot reach the sibling-attribution branch (floating fixture key)packages/cli/src/acp-integration/acpAgent.test.ts:13366 — [review] ACP R39-7 collapse test never asserts migratedLegacyModelIdspackages/desktop/packages/server-core/src/handlers/rpc/onboarding.ts:89 — [probe] hasExistingProviderConfig ignores modelIdsByBaseUrl — configured provider reported unconfiguredpackages/cli/src/serve/run-qwen-serve.test.ts:503 — [probe] serve R39-7 test never asserts migratedLegacyModelIds; customProvider masks the claimpackages/core/src/providers/__tests__/install.test.ts:687 — [review] cross-provider merge tests never assert the other provider's entries survivepackages/core/src/providers/__tests__/install.test.ts:1190 — [probe] R39-2 test omits migratedLegacyModelIds — the !namesSiblingEndpoint guard is never load-bearingpackages/desktop/apps/electron/src/renderer/components/apisetup/provider-state.test.ts:479 — [review] resetTrimmedDefaultModelIds is tested but wired to no production callerpackages/web-shell/client/components/messages/auth-provider-state.test.ts:318 — [review] mimo fixture drops per-option envKeys and pins the wrong credential domain
Convergence: round 44 posted 4 inline comment(s), 4 of them reported for the first time; the previous round posted 4 (4 new). Findings keep coming back to the same files: packages/cli/src/serve/run-qwen-serve.ts (findings in round 43; 1 more now); packages/cli/src/ui/auth/AuthDialog.tsx (findings in round 43; 1 more now). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push keeps the loop from re-deriving the same set; this PR's reviews already resolve to a critical posting floor. (Observation only — nothing was withheld from this review because of this observation.)
[Critical] R44 re-check: existing blocker (comment 3827370555, packages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.ts:436, anchored code unchanged since posting) STILL STANDS — deselecting a restored floating-key baseUrl-less legacy entry in the VS Code wizard is a silent no-op: ownsCustomEnvKeyShape rejects prefix-only keys, so the stored original is never claimed by the install plan and survives every deselection (this round's chunk-38 audit independently re-traced the mechanism at the reviewed head).
中文说明
仅完成部分审查,审查缺口已披露。
未决,请确认:共 1 条(原文未翻译,列表见上方英文部分)。
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
未探索到全部深度(达到工具调用预算):"agent invariant-a (packages/core/src/providers/provider-con…":none — no check was cut short.;chunk 10:did not execute the new tests — the review worktree has no node_modules (and no built dist/ ), and a full npm ci + workspace build + vitest run exceeded th…;chunk 35:none — no checks were cut short.。
未审查:反向审计——评审时间预算不足,未能开始第 3 轮。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 44 轮,非阻断)——已记录,本轮不要求修改:共 15 条(原文未翻译,列表见上方英文部分)。
收敛情况:第 44 轮发布了 4 条行内评论,其中 4 条是首次提出;上一轮发布了 4 条(其中 4 条首次提出)。发现反复回到同一批文件:packages/cli/src/serve/run-qwen-serve.ts(第 43 轮已出过发现,本轮又有 1 条);packages/cli/src/ui/auth/AuthDialog.tsx(第 43 轮已出过发现,本轮又有 1 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,可以避免循环反复推导同一组发现;本 PR 的评审已解析为 critical 发布下限。(仅为观察——本轮评审未因此扣留任何内容。)
[Critical] R44 re-check: existing blocker (comment 3827370555, packages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.ts:436, anchored code unchanged since posting) STILL STANDS — deselecting a restored floating-key baseUrl-less legacy entry in the VS Code wizard is a silent no-op: ownsCustomEnvKeyShape rejects prefix-only keys, so the stored original is never claimed by the install plan and survives every deselection (this round's chunk-38 audit independently re-traced the mechanism at the reviewed head).
— qwen3.8-max via Qwen Code /review (v0.22.0)
# Conflicts: # packages/cli/src/acp-integration/acpAgent.test.ts
…on round-tripped ids R44-1: endpoint-match clause requires model.baseUrl !== undefined so a free-form install with an empty resolved baseUrl cannot claim every baseUrl-less legacy entry via '' === ''. R44-3: id-collision clause additionally requires namesSelectedEndpoint, so a floating key (names no endpoint) whose id collides with a migrated entry is no longer claimed and deleted. R44-2 + R44-4: add ProviderSetupInputs.roundTrippedLegacyModelIds. The free-form env-key ownership clause treats omission as deselection only for ids the caller exposed (or that the plan writes). Serve passes [] (catalog exposes no existingConfig, absence is never deselection); the CLI dialog passes the ids it surfaced, protecting an attributable entry it could not restore/expose from silent deletion on submit.
|
Round 44 — all 4 [Critical] findings verified against the code and confirmed real. All fixed in Each finding reproduces on R44-1 — ownsModel endpoint-match clause degenerates at R44-2 — R42-1 merge-only guarantee void for the free-form provider on serve ( R44-3 — dialog R44-4 — dialog hides attributable baseUrl-less entries yet the plan claims them ( Verification (all under the build lock). With the fix applied, all four new R44 regression tests pass and the pre-existing suites stay green:
Negative control. Each regression test encodes the corresponding bot probe. On the unfixed code that probe deletes the entry — R44-1: Unrelated failures, noted for transparency (neither is in code this PR changed):
|
The workflow grew from 29715 to 42519 bytes when QwenLM#9587 landed on main without a baseline update (a latent main-side violation every PR merging main now trips, as the check message itself directs). Record the new size following the same remedy as QwenLM#9747/QwenLM#9682.
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Unresolved, please confirm:
- [Critical] Blocker threads from rounds 1-43 (~150 entries, all in this PR's provider-auth machinery files) could not be individually re-traced against this head within this round's time budget; the round-44 re-check carried them as cannot-tell under t…
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
Not explored to full depth (tool budget reached): chunk 43: running auth-provider-state.test.ts via vitest (no node_modules/built dist in the review worktree; install+build exceeds tool budget); "agent reverse-audit (round 1)": none — not emitting one per the brief (nothing was cut short); chunk 29: could not execute packages/core unit tests — the review worktree has no node_modules installed ( vitest unresolvable) and a full install+build exceeds the prac….
Not reviewed: reverse audit — stopped before round 3 by the review time budget.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 45, not a blocker) — recorded, not requested in this round:
packages/cli/src/ui/auth/AuthDialog.tsx:89 — [review] providerToItem description JSX duplicates renderItem's string wrappingpackages/cli/src/ui/auth/AuthDialog.tsx:262 — [probe] restoredModelIds can seed a duplicate id into the models fieldpackages/cli/src/ui/auth/AuthDialog.tsx:432 — [review] initialViewLevel prop set by no production caller (dead switch)packages/cli/src/ui/auth/useProviderSetupFlow.ts:201 — [review] start() 13 positional params — two string[] slots transpose silentlypackages/cli/src/ui/auth/useProviderSetupFlow.ts:251 — [review] custom-vs-trimmed-defaults split implemented three times (divergence risk)packages/core/src/providers/__tests__/install.test.ts:713 — [review] test leaks process.env[TOKEN_PLAN_ENV_KEY] (no try/finally cleanup)packages/core/src/providers/types.ts:130 — [review] envKeyNamesAnEndpoint docstring contradicts implementationpackages/desktop/apps/electron/src/renderer/components/apisetup/provider-state.ts:249 — [review] resetTrimmedDefaultModelIds dead exportpackages/cli/src/serve/run-qwen-serve.ts:6250 — [review] serve install route preservation wiring has no route-level testpackages/cli/src/serve/run-qwen-serve.test.ts:503 — [probe] serve R39-7 collapse test never asserts migratedLegacyModelIdspackages/cli/src/acp-integration/acpAgent.test.ts:13564 — [probe] ACP R39-7 collapse test never asserts migratedLegacyModelIdspackages/cli/src/ui/hooks/useProviderUpdates.test.ts:52 — [probe] METADATA_KEY rekey turned the non-default-baseUrl version-match test vacuouspackages/cli/src/ui/hooks/useProviderUpdates.test.ts:1253 — [probe] negative-only assertions with no completion anchorpackages/cli/src/ui/auth/useProviderSetupFlow.test.ts:1447 — [probe] three full-chain tests leak process.env keys (no cleanup)packages/core/src/providers/__tests__/presets/xiaomi-mimo.test.ts:118 — [probe] circular metadata-key assertion (function under test on both sides)packages/web-shell/client/components/messages/auth-provider-state.test.ts:40 — [review] mimo fixture drops per-option envKeys — pins a shape the daemon never emitspackages/desktop/apps/electron/src/renderer/components/apisetup/provider-state.test.ts:1 — [test] new desktop bun:test suite runs on no PR-gated CI jobpackages/desktop/packages/server-core/src/handlers/rpc/onboarding.test.ts:1 — [test] new desktop bun:test suite runs on no PR-gated CI jobscripts/tests/no-ak-integration-ci.test.js:214 — [test] root-level guard outside this review's scoped runs (CI-gated via test:scripts)
Convergence: round 45 posted 7 inline comment(s), 7 of them reported for the first time; the previous round posted 4 (4 new). The rate of new findings is not falling. Batching the remaining fixes and verifying them before the next push keeps the loop from re-deriving the same set; this PR's reviews already resolve to a critical posting floor. (Observation only — nothing was withheld from this review because of this observation.)
Mechanism health: this round did not close cleanly, so it withholds the incremental anchor — and the round it recovered had none either, so the next review re-reads the whole diff and will keep doing so until a round's marker carries an anchor again. (Stated, not acted on — this changes nothing about what the round posts.)
[Critical] R44-5 re-check: existing blocker (comment 3827370555, packages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.ts:436) STILL STANDS — the round-44 fix commit f3c4570 does not touch AuthMessageHandler.ts; this round's end-to-end probes re-traced the VS Code wizard mechanism at HEAD: deselecting a restored floating-key baseUrl-less legacy entry remains a silent no-op (ownsCustomEnvKeyShape rejects prefix-only keys, so the stored original is never claimed by the install plan and survives every deselection), and seeded floating entries still duplicate permanently (see R45-5). 中文:第 44 轮修复提交未触及 AuthMessageHandler.ts;本轮端到端探针在 HEAD 重新追踪了 VS Code 向导机制:取消选择已恢复的浮动键无 baseUrl 遗留条目仍是静默无效操作,播种的浮动条目仍会永久重复(见 R45-5)。
中文说明
仅完成部分审查,审查缺口已披露。
未决,请确认:共 1 条(原文未翻译,列表见上方英文部分)。
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
未探索到全部深度(达到工具调用预算):chunk 43:running auth-provider-state.test.ts via vitest (no node_modules/built dist in the review worktree; install+build exceeds tool budget);"agent reverse-audit (round 1)":none — not emitting one per the brief (nothing was cut short);chunk 29:could not execute packages/core unit tests — the review worktree has no node_modules installed ( vitest unresolvable) and a full install+build exceeds the prac…。
未审查:反向审计——评审时间预算不足,未能开始第 3 轮。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 45 轮,非阻断)——已记录,本轮不要求修改:共 19 条(原文未翻译,列表见上方英文部分)。
收敛情况:第 45 轮发布了 7 条行内评论,其中 7 条是首次提出;上一轮发布了 4 条(其中 4 条首次提出)。新发现的产出速度没有下降。把剩余修复攒成一批、验证后再推送,可以避免循环反复推导同一组发现;本 PR 的评审已解析为 critical 发布下限。(仅为观察——本轮评审未因此扣留任何内容。)
机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有锚点,因此下一次评审将重读整个 diff——并会一直如此,直到某一轮的标记重新带上锚点。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)
[Critical] R44-5 re-check: existing blocker (comment 3827370555, packages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.ts:436) STILL STANDS — the round-44 fix commit f3c4570 does not touch AuthMessageHandler.ts; this round's end-to-end probes re-traced the VS Code wizard mechanism at HEAD: deselecting a restored floating-key baseUrl-less legacy entry remains a silent no-op (ownsCustomEnvKeyShape rejects prefix-only keys, so the stored original is never claimed by the install plan and survives every deselection), and seeded floating entries still duplicate permanently (see R45-5). 中文:第 44 轮修复提交未触及 AuthMessageHandler.ts;本轮端到端探针在 HEAD 重新追踪了 VS Code 向导机制:取消选择已恢复的浮动键无 baseUrl 遗留条目仍是静默无效操作,播种的浮动条目仍会永久重复(见 R45-5)。
— qwen3.8-max via Qwen Code /review (v0.22.0)
… floating ids R45-1: readExistingProviderConfig seeded baseUrl-less legacy ids that fail endpoint attribution into the top-level modelIds, the free-form modelIdsByBaseUrl reduce, and the per-protocol views; the desktop client submits the seed back as an explicit selection and adopts entries the install plan can never claim back (a permanent duplicate). Gate every baseUrl-less seed on namesSelectedEndpoint via a shared predicate. R45-2: the merge branch adopted floating baseUrl-less entries (env key names no endpoint) but the id-collision claim is gated on namesSelectedEndpoint, which a floating key can never satisfy — the stamped copy persisted beside the unclaimed original. Thread explicitly-adopted floating ids through a dedicated ProviderSetupInputs.adoptedFloatingModelIds channel (ACP route + serve twin), kept distinct from migratedLegacyModelIds so the R44-3 over-claim guard stays intact. R45-3: the free-form baseUrl Input onBlur early-returned without committing the canonical form when it reconciled to the committed endpoint, so handleSubmit submitted the raw trailing-slash/userinfo variant. Commit the canonical form. R45-4: the VS Code non-merge branch stamped/deleted fail-closed shared-key baseUrl-less entries (a non-merge plan carries the unscoped ownsModel). Carry them through UNSTAMPED, mirroring ACP/serve/CLI. R45-5: the VS Code restore path seeded+stamped floating entries it could never claim. Gate the restored/seeded set on attribution and thread stamped attributable ids via migratedLegacyModelIds so the install plan collapses the stored original. R45-6: the non-merge update flow conflated baseUrl-less legacy built-ins with sibling-endpoint entries — a false "all models added" diff and a permanent stamped duplicate per built-in. For single-endpoint (string-baseUrl) providers count them as the selected endpoint's in both the preserve filter (template replaces them) and the installed-id diff (not reported as additions). R45-7: stripUserInfo truncated the authority at the first '/', diverging from the producer sanitizeProviderBaseUrl when a basic-auth password contains '/', '?', or '#'. Port the producer's guarded whole-string last-'@' fallback. Regression tests added for each (core install, acpAgent, run-qwen-serve, useProviderUpdates, VS Code AuthMessageHandler, desktop provider-state).
# Conflicts: # docs/users/configuration/auth.md # packages/cli/src/serve/core-runtime.ts # packages/core/src/providers/all-providers.ts # packages/core/src/telemetry/gen-ai-provider.test.ts # packages/core/src/telemetry/gen-ai-provider.ts
|
Round-45 response — all 7 [Critical] items verified line-by-line against the code at 7afbf33; all seven are genuine (several are regressions/edge-cases in our own round-36..44 machinery, as anticipated). All fixed in R45-1 — R45-2 — merge branch adopts floating baseUrl-less entries but can never claim them. Confirmed (ACP and its serve twin). R45-3 — free-form baseUrl R45-4 — VS Code non-merge branch stamps/deletes fail-closed shared-key entries. Confirmed. This is the AuthMessageHandler gap the round-43/44 notes already flagged as a known residual; minimax/zai/alibaba-standard (non-merge, array baseUrl, one shared static key) fail attribution closed, yet R45-5 — VS Code restore path seeds+stamps floating entries it can never claim. Confirmed (same root as the round-44 blocker on this file). For merge free-form, R45-6 — non-merge update flow conflates baseUrl-less legacy entries with sibling entries. Confirmed. R45-7 — Verification (all under the shared build lock, re-run after merging origin/main): core Merge note: |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
Not explored to full depth (tool budget reached): chunk 11: executing AuthDialog.test.tsx to observe the failure (worktree has no node_modules ; full npm ci + build exceeds the tool budget); chunk 25: executing install.test.ts under vitest — the review worktree has no node_modules , and npm ci + monorepo build exceeded this chunk's tool budget; all expec…; "agent invariant-b (packages/core/src/providers/provider-con…": none — no check was cut short..
Not reviewed: reverse audit — stopped before round 2 by the review time budget.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 46, not a blocker) — recorded, not requested in this round:
packages/cli/src/ui/auth/useProviderSetupFlow.ts:477 — [probe] selectProtocol clears apiKeyError/modelIdsError but not baseUrlError — stale validation error after a protocol switchpackages/cli/src/ui/auth/useProviderSetupFlow.ts:601 — [probe] submitBaseUrl swaps the visible API key without clearing apiKeyError — stale empty-key error under a restored key.github/workflows/ci.yml:586 — [review] no-AK gate blanks MIMO_API_KEY but omits MIMO_TOKEN_PLAN_API_KEY (+ scripts/tests/no-ak-integration-ci.test.js pinned list)packages/cli/src/ui/auth/AuthDialog.tsx:582 — [review] CUSTOM_PROVIDER case duplicates handleProviderSelect's body verbatim (13-positional start call) — drift riskpackages/desktop/apps/electron/src/renderer/components/apisetup/ProviderConnectForm.tsx:262 — [review] seed-application block triplicated across selectProvider and both handleProtocolChange branchespackages/desktop/apps/electron/src/renderer/components/apisetup/ProviderConnectForm.tsx:552 — [review] no component-level test for the new glue (blur canonicalization commit, protocol-flip re-seed, reconciliation)docs/users/configuration/auth.md:6 — [review] Third-party Providers list omits 'Kimi (Moonshot AI) API Key' while it remains selectable — coupled to the R46-1 resolutionpackages/cli/src/ui/hooks/useProviderUpdates.test.ts:891 — [review] no-inference tests assert on setValue instead of the batched setValues writer — the guard can never fail (mutation-probed)
中文说明
仅完成部分审查,审查缺口已披露。
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
未探索到全部深度(达到工具调用预算):chunk 11:executing AuthDialog.test.tsx to observe the failure (worktree has no node_modules ; full npm ci + build exceeds the tool budget);chunk 25:executing install.test.ts under vitest — the review worktree has no node_modules , and npm ci + monorepo build exceeded this chunk's tool budget; all expec…;"agent invariant-b (packages/core/src/providers/provider-con…":none — no check was cut short.。
未审查:反向审计——评审时间预算不足,未能开始第 2 轮。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 46 轮,非阻断)——已记录,本轮不要求修改:共 8 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.22.0)
…stry discovery
R46-1: kimiProvider derives MOONSHOT_API_KEY for its regional API endpoints
(api.moonshot.{ai,cn}/v1) while the upstream moonshotProvider declares the
same key statically for the same URLs, and findProviderByCredentials was a
plain first-match find over ALL_PROVIDERS — kimi registered first, so the
lookup that resolved to moonshot at the merge base resolved to kimi and
moonshot.test.ts failed ('expected kimi to be moonshot'). Make credential
discovery deterministic instead of order-dependent: a preset declaring the
env key statically is the canonical owner of that credential space and beats
presets that only derive the same key via a function envKey. This keeps the
round-45 adjudication (MOONSHOT_API_KEY attribution belongs to the upstream
moonshot provider, as in telemetry) while kimi keeps its regional API
endpoints selectable and uniquely owns the KIMI_CODE_API_KEY Coding Plan
space. Registry label order stays untouched. Tests: pin the collision
outcome in all-providers.test.ts and flip kimi.test.ts's discovery
assertions to the adjudicated owner.
R46-2: the AuthDialog provider-walk test omitted 'Kimi (Moonshot AI) API
Key', which the alphabetical THIRD_PARTY_PROVIDERS sort places between
'Kimi' and 'MiniMax API Key' — the walk landed on the moonshot label and
timed out waiting for MiniMax (gated by itWhenTuiInputReliable, so it only
failed outside CI). Insert the missing label.
|
Round-46 response — both Critical threads verified genuine and fixed in 6432e8e. R46-1 ( Fix: credential discovery is now deterministic instead of order-dependent — a preset declaring the env key statically is the canonical owner of that credential space and beats presets that only derive the same key via a function R46-2 ( Verification at new head 6432e8e: core provider suite 223/223 (was 221/222, plus one new regression test); |
The merge of origin/main lost the typecheck:integration script and its reference in the typecheck script, breaking the CI typecheck step (Missing script: typecheck:integration). Restore both from main.
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
中文说明
仅完成部分审查,审查缺口已披露。
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
— qwen3.8-max via Qwen Code /review (v0.22.0)
# Conflicts: # packages/desktop/apps/electron/src/renderer/components/apisetup/ProviderConnectForm.tsx # packages/desktop/packages/server-core/src/handlers/rpc/onboarding.ts # packages/desktop/packages/shared/src/protocol/dto.ts
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
Not reviewed: reverse audit — stopped before round 3 by the review time budget.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 48, not a blocker) — recorded, not requested in this round:
.github/workflows/ci.yml:611 — [review] The new Xiaomi MiMo preset reads a second env key,…packages/cli/src/acp-integration/acpAgent.test.ts:13709 — [review] The R39-7 twin-collapse test asserts only preserveModels…packages/cli/src/ui/auth/AuthDialog.tsx:151 — [probe] getMaxItemsToShow always reserves SCROLL_AFFORDANCE_ROWS…packages/cli/src/ui/auth/AuthDialog.tsx:314 — [probe] restoredModelIds is never deduplicated, so in the…packages/cli/src/ui/auth/AuthDialog.tsx:433 — [review] The new initialViewLevel prop is declared and read…packages/cli/src/ui/hooks/useProviderUpdates.test.ts:547 — [review] The only test pinning a merge-provider update with a…packages/cli/src/ui/hooks/useProviderUpdates.test.ts:895 — [review] The three 'no inferred kimi-- metadata persisted' guards…packages/cli/src/ui/hooks/useProviderUpdates.ts:239 — [probe] persistEndpointMetadataMigration swallows every setValues…packages/cli/src/ui/hooks/useProviderUpdates.ts:261 — [probe] The R45-6 fix that stops baseUrl-less legacy built-ins…packages/core/src/providers/__tests__/install.test.ts:722 — [probe] The token-plan key-rotation test ('keeps an id-only…packages/desktop/apps/electron/src/renderer/components/apisetup/provider-state.ts:294 — [review] resetTrimmedDefaultModelIds is an exported helper with no…packages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.test.ts:449 — [probe] The R45-5/R45-4 regression tests (also :490-491) assert…
中文说明
仅完成部分审查,审查缺口已披露。
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
未审查:反向审计——评审时间预算不足,未能开始第 3 轮。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 48 轮,非阻断)——已记录,本轮不要求修改:共 12 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.22.0)
…-out main removed packages/desktop (QwenLM#9085, OpenWork fork); this branch's provider-state module and desktop onboarding test no longer have their surrounding implementation. The Kimi/Xiaomi auth work for live surfaces remains in cli and vscode-ide-companion.
Round-46 findings (all negative-controlled): R46-1 (AuthDialog): getProtocolSetups computed attribution and computePreservedModels only for truthy protoBaseUrl, while the flat view gated on initialBaseUrl === undefined — a free-form bucket whose first saved model has no baseUrl resolves to '' and lost its preserveModels on any protocol switch-and-back. Both are now computed unconditionally. R46-2 (AuthMessageHandler): isSelectedEndpointModel required model.baseUrl !== undefined for endpoint-scoped merge providers, so every baseUrl-less legacy entry was dropped before attribution — dead wiring for the Kimi/Xiaomi presets. Attributable entries are admitted, stamped, and recorded in migratedLegacyModelIds; kimi test updated (+ regression). R46-3 (useProviderUpdates): for string-baseUrl (no-sibling) providers the preservedModels filter kept built-ins stamped at a stale URL as "sibling" entries, duplicating every built-in when a preset URL changes. Preservation is now limited to custom ids for single-endpoint providers. R46-4 (acpAgent): list-time seeding skipped ''-baseUrl per-protocol buckets (attribution now unconditional), and connect claimed every attributable-but-absent entry as an informed deselection while never passing roundTrippedLegacyModelIds. Connect now threads the ids the list-time seed actually exposed (collectSeededModelIds) and scopes the R41-3 pure-absence claim to that set plus generated-default supersession. R46-5 (acpAgent + serve): the non-merge branches never applied the R39-7 stamped-twin collapse — a same-id legacy+stamped pair persisted as two identical (id, baseUrl) entries. Both branches now consult stampedIdsAtSelectedEndpoint (after the fail-closed carry). R46-6 (serve + acpAgent): the R39-7 collapse pushed floating originals into adoptedFloatingModelIds even on implicit reconnects — id collision alone decided deletion (R39-3). Adoption is now gated on hasExplicitModelIds && requested; implicit reconnects leave the entry unclaimed. R46-7 (AuthDialog): array-baseUrl entries stamped at a URL matching no preset option diverged from the submission endpoint — submitting wrote a stamped copy at the first option beside the unclaimed stale original. Snapping the restored endpoint broke the main-pinned prefill contract (token-plan test), so the restore keeps the raw URL and the duplicate is closed at submit: buildCurrentInputs re-stamps stale entries at the submission endpoint and emits their ids in migratedLegacyModelIds, and buildInstallPlan gains an R40-2-disciplined stale-stamped claim clause. R46-8 (AuthMessageHandler + dialog): the VS Code surface (and the CLI dialog) never populated adoptedFloatingModelIds — a floating entry whose id the user explicitly typed was regenerated stamped while the stored original could never be claimed. Both surfaces now adopt such entries through the dedicated channel. Tests added across AuthDialog/useProviderSetupFlow/useProviderUpdates/ acpAgent/run-qwen-serve/AuthMessageHandler suites.
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
Not explored to full depth (tool budget reached): chunk 6: executing the describe block to confirm it goes green — the review worktree has no node_modules or built workspace dist/ outputs, and a full npm ci + buil…; chunk 26: running packages/core vitest on install.test.ts (worktree has no node_modules/dist; full install+build exceeded the tool budget); chunk 25: running install.test.ts under vitest to confirm the traced expectations execute green (no built dist/ in the review worktree).; chunk 17: executing useProviderSetupFlow.test.ts under vitest — the review worktree has no node_modules (and neither does the parent checkout), so npm ci plus the w….
Not reviewed: reverse audit — stopped before round 3 by the review time budget.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 49, not a blocker) — recorded, not requested in this round:
.github/workflows/ci.yml:688 — [review] MIMO_TOKEN_PLAN_API_KEY missing from the no-AK gate blanking list and its pin testpackages/core/src/providers/__tests__/install.test.ts:713 — [review] Token-plan reinstall test leaks BAILIAN_TOKEN_PLAN_API_KEY into process.env for the rest of the filepackages/core/src/providers/__tests__/install.test.ts:1449 — [review] R44-3 test's toContainEqual pair cannot detect the unclaimed original survivingpackages/cli/src/ui/auth/AuthDialog.tsx:687 — [review] Saved-state wiring block duplicated verbatim across handleProviderSelect and handleMainSelectpackages/cli/src/ui/auth/useProviderSetupFlow.ts:510 — [review] selectProtocol clears apiKeyError and modelIdsError but not baseUrlErrordocs/users/configuration/auth.md:6 — [review] Provider list omits the legacy Moonshot preset; /auth now renders two adjacent Kimi entriespackages/vscode-ide-companion/src/services/settingsWriter.ts:420 — [review] writeModelProvidersConfig deletes only bare plan metadata keys, leaving endpoint-suffixed keys (phantom update prompts)scripts/tests/no-ak-integration-ci.test.js:220 — [test] The modified no-AK integration test is unreachable by any workspace test command and its CI gate is conditionalpackages/cli/src/serve/run-qwen-serve.ts:1971 — [review] Fail-closed baseUrl-less DEFAULT-id entries carried unstamped while stamped twins regenerated (permanent duplicate pair)packages/cli/src/ui/hooks/useProviderUpdates.test.ts:1007 — [review] Three negative inference tests assert setValue (singular) but the guarded path persists via setValues (batch)packages/core/src/providers/__tests__/presets/xiaomi-mimo.test.ts:128 — [review] MiMo metadata-key assertions are circular — computed by the function under testpackages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.test.ts:456 — [review] R45-5/R45-4 tests assert the typed input, not the seeded prefill — the seeding gate is untestedpackages/web-shell/client/components/messages/AuthMessage.tsx:205 — [review] startProvider: a provider with baseUrl: [] slips through both model seeders — stale models fieldpackages/cli/src/acp-integration/acpAgent.test.ts:13895 — [review] R39-7 fixture has only two kimi endpoints — the fail-closed MOONSHOT survival it claims to pin never exercisespackages/cli/src/serve/run-qwen-serve.test.ts:1009 — [review] R44-2 test asserts survival by id alone — survival-with-mutation not caughtpackages/cli/src/serve/run-qwen-serve.ts:7211 — [review] Twin-collapse reads ownsModel-filtered models — a name-prefix-stripped stamped twin is invisible (permanent duplicate)packages/cli/src/ui/auth/AuthDialog.test.tsx:590 — [review] R43-3 fail-closed tests never assert floatingLegacyModels stays empty — adoption-channel exclusion untested
Convergence: round 49 posted 6 inline comment(s), 6 of them reported for the first time; the previous round posted 10 (10 new). Findings keep coming back to the same files: packages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.ts (findings in round 48; 2 more now); packages/cli/src/acp-integration/acpAgent.ts (findings in round 48; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)
中文说明
仅完成部分审查,审查缺口已披露。
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
未探索到全部深度(达到工具调用预算):chunk 6:executing the describe block to confirm it goes green — the review worktree has no node_modules or built workspace dist/ outputs, and a full npm ci + buil…;chunk 26:running packages/core vitest on install.test.ts (worktree has no node_modules/dist; full install+build exceeded the tool budget);chunk 25:running install.test.ts under vitest to confirm the traced expectations execute green (no built dist/ in the review worktree).;chunk 17:executing useProviderSetupFlow.test.ts under vitest — the review worktree has no node_modules (and neither does the parent checkout), so npm ci plus the w…。
未审查:反向审计——评审时间预算不足,未能开始第 3 轮。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 49 轮,非阻断)——已记录,本轮不要求修改:共 17 条(原文未翻译,列表见上方英文部分)。
收敛情况:第 49 轮发布了 6 条行内评论,其中 6 条是首次提出;上一轮发布了 10 条(其中 10 条首次提出)。发现反复回到同一批文件:packages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.ts(第 48 轮已出过发现,本轮又有 2 条);packages/cli/src/acp-integration/acpAgent.ts(第 48 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)
— qwen3.8-max via Qwen Code /review (v0.22.0)
Close six interlocking defects in the stale-stamped / baseUrl-less legacy-model claim machinery surfaced by round-2 review. - VS Code: record the migratedLegacyModelIds claim for EVERY attributable baseUrl-less entry admitted to the seed (selected or not), ahead of the twin dedup, so a deselection is owned instead of no-oping forever. - VS Code: adopt an explicitly typed stale-stamped id (re-stamp at the submission endpoint + claim) so the pair collapses. - ACP + serve: add the stale-stamped claim branch mirroring the CLI — a requested id re-stamps and is claimed; an exposed-but-omitted id is an informed deselection; a never-exposed entry is never claimed. - CLI dialog: gate the stale-stamped branch on which ids the views actually prefilled (surfacedStaleModelIds); a never-surfaced stale entry fails closed (left out of the plan) instead of being claimed and deleted. - CLI dialog: when the restored endpoint diverges from the resolved one (first saved model is a stale stamp), seed the models field from the resolved endpoint's own bucket so genuinely-saved defaults render checked. - CLI dialog: carry a non-merge ARRAY-baseUrl provider's restored-endpoint DEFAULT entries so switching endpoint before submit does not delete them. Adds one regression test per finding (R46-1..R46-6) and keeps the prior round's negative controls green.
…omi-auth # Conflicts: # packages/cli/src/ui/auth/AuthDialog.test.tsx # packages/cli/src/ui/auth/ProviderSetupSteps.test.tsx # packages/cli/src/ui/auth/ProviderSetupSteps.tsx
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
Not explored to full depth (tool budget reached): chunk 28: run kimi.test.ts under vitest — the review worktree has no node_modules / dist , and npm ci + npm run build exceeds the tool budget; every assertion was ….
Not reviewed: reverse audit — stopped before round 3 by the review time budget.
Not reviewed: the diff sections covering packages/cli/src/ui/auth/ProviderSetupSteps.test.tsx, packages/cli/src/ui/auth/ProviderSetupSteps.tsx, packages/core/src/providers/tests/presets/xiaomi-mimo.test.ts, packages/core/src/providers/tests/provider-config.test.ts, "agent verify (round 2)" — pointed at diff lines it never opened: it made tool calls, but none of them read the diff.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 50, not a blocker) — recorded, not requested in this round:
.github/workflows/ci.yml:626 — [review] MIMO_TOKEN_PLAN_API_KEY missing from the no-AK gate blanking list and its pin testpackages/cli/src/acp-integration/acpAgent.test.ts:13900 — [probe] R39-7 fixture has only two kimi endpoints — the fail-closed MOONSHOT survival it claims to pin never exercisespackages/cli/src/serve/run-qwen-serve.ts:1906 — [review] hasExplicitModelIds treats [] as explicit while normalizeInstallModelIds treats [] as implicitpackages/cli/src/serve/run-qwen-serve.ts:77 — [review] module-scope static import of legacyEnvKeyAttribution bypasses the loadCoreRuntime fast-path boundarypackages/core/src/providers/__tests__/install.test.ts:713 — [review] token-plan reinstall test leaks BAILIAN_TOKEN_PLAN_API_KEY into process.env for the rest of the filepackages/core/src/providers/__tests__/install.test.ts:1090 — [review] R38-3 fixture uses a prefix-only floating key, not the old-shape legacy key it claimspackages/cli/src/acp-integration/acpAgent.test.ts:13797 — [probe] R45-5 fixture/mock cannot exercise the free-form sibling-guard armpackages/cli/src/acp-integration/acpAgent.ts:1828 — [probe] seed escape hatch over-seeds stamped models when the first saved model has no baseUrlpackages/cli/src/ui/auth/AuthDialog.test.tsx:244 — [review] doubled fixed 50ms sleeps on both sides of every keystroke add dead wall-clock per local runpackages/cli/src/ui/hooks/useProviderUpdates.test.ts:52 — [review] METADATA_KEY rename to the China-endpoint key vacuates the global-endpoint versions-match testpackages/cli/src/ui/hooks/useProviderUpdates.test.ts:976 — [probe] three negative inference tests assert setValue (singular) but the guarded path persists via setValues (batch)packages/core/src/providers/__tests__/install.test.ts:1449 — [probe] R44-3 migrated-claim clause (a) is shadowed by the free-form clause (b)packages/core/src/providers/__tests__/provider-config.test.ts:1250 — [review] sibling-protection assertion missing for the international moonshot endpoint despite the plural commentpackages/core/src/providers/provider-config.ts:473 — [probe] preserved entries with no generated twin are appended with their stale envKey on the serve pathpackages/vscode-ide-companion/src/webview/handlers/AuthMessageHandler.test.ts:560 — [probe] R45-4 asserts the typed input, not the seeded prefill — the admission gate is untestedpackages/cli/src/acp-integration/acpAgent.test.ts:580 — [review] mock resolvers bypass the trailing-slash normalization their real counterparts applypackages/cli/src/ui/auth/useProviderSetupFlow.test.ts:194 — [probe] seven tests leak fixture API keys into process.env with no cleanuppackages/cli/src/ui/hooks/useProviderUpdates.ts:258 — [probe] merge providers' baseUrl-less legacy built-ins are reported as added and duplicated on update
Convergence: round 50 posted 4 inline comment(s), 3 of them reported for the first time; the previous round posted 6 (6 new). Findings keep coming back to the same files: packages/cli/src/acp-integration/acpAgent.ts (findings in round 49; 1 more now); packages/cli/src/ui/auth/useProviderSetupFlow.ts (findings in round 49; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)
中文说明
仅完成部分审查,审查缺口已披露。
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
未探索到全部深度(达到工具调用预算):chunk 28:run kimi.test.ts under vitest — the review worktree has no node_modules / dist , and npm ci + npm run build exceeds the tool budget; every assertion was …。
未审查:反向审计——评审时间预算不足,未能开始第 3 轮。
未审查:涉及 packages/cli/src/ui/auth/ProviderSetupSteps.test.tsx、packages/cli/src/ui/auth/ProviderSetupSteps.tsx、packages/core/src/providers/tests/presets/xiaomi-mimo.test.ts、packages/core/src/providers/tests/provider-config.test.ts 的 diff 片段、"agent verify (round 2)"——启动 prompt 为它指定了 diff 中的行,但它从未打开:有工具调用,却没有一次读取 diff。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 50 轮,非阻断)——已记录,本轮不要求修改:共 18 条(原文未翻译,列表见上方英文部分)。
收敛情况:第 50 轮发布了 4 条行内评论,其中 3 条是首次提出;上一轮发布了 6 条(其中 6 条首次提出)。发现反复回到同一批文件:packages/cli/src/acp-integration/acpAgent.ts(第 49 轮已出过发现,本轮又有 1 条);packages/cli/src/ui/auth/useProviderSetupFlow.ts(第 49 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)
— qwen3.8-max via Qwen Code /review (v0.22.0)
What this PR does
Adds first-class Kimi and Xiaomi MiMo presets to
/auth→ Third-party Providers. Kimi appears as one provider with Coding Plan, API Key (China), and API Key (International) access choices; Xiaomi MiMo appears as one provider with pay-as-you-go plus China, Singapore, and Europe Token Plan endpoints.Carries endpoint-specific model metadata through the CLI, ACP, daemon/SDK, VS Code, Web Shell, and desktop setup flows so each selected endpoint receives the correct default models and environment key. The third-party provider registry is displayed alphabetically, and the
/authlists now paginate according to the available terminal height with visible scroll arrows.Why it's needed
Kimi and Xiaomi MiMo previously required users to recreate supported endpoints through Custom Provider, which was repetitive and made subscription-specific endpoints difficult to discover. Kimi also uses different credentials and model catalogs for Coding Plan versus its regional APIs, so a single flat model list would install invalid choices for some endpoints.
The provider list also became taller than the dialog after these additions. Its previous logical limit was ten items, but every descriptive item consumes multiple terminal rows, so the outer height constraint clipped content without activating list pagination.
Reviewer Test Plan
How to verify
/auth→ Third-party Providers. Verify the displayed provider labels are alphabetical, DeepSeek remains first, and▲/▼appear when the list exceeds the available height. Continue pressing Down and verify Kimi and Xiaomi MiMo become visible without clipping the footer.k3-256k,k3,kimi-for-coding, andkimi-for-coding-highspeed; either API option should recommendkimi-k3,kimi-k2.7-code,kimi-k2.7-code-highspeed, andkimi-k2.6.mimo-v2.5-proandmimo-v2.5model recommendations.Automated validation: 157 core provider tests passed; core build and typecheck passed; 413 focused CLI tests passed; 10 VS Code auth-handler tests passed; SDK and VS Code typechecks passed; changed files passed ESLint and Prettier.
Evidence (Before & After)
Before: Kimi and Xiaomi MiMo were absent from Third-party Providers and required Custom Provider setup. The descriptive provider list could exceed the constrained dialog height while still reporting that all logical items fit, leaving later providers and the footer clipped.
After: A 100×24 macOS terminal running
npm run dev -- --screen-readerkept the footer visible and moved the two-item viewport as Down was pressed:Tested on
Environment (optional)
macOS, Node.js 24,
QWEN_SANDBOX=false, source CLI throughnpm run dev -- --screen-reader, terminal size 100×24.Risk & Scope
Linked Issues
None.
中文说明
这个 PR 做了什么
在
/auth→ Third-party Providers 中加入 Kimi 和 Xiaomi MiMo 的一等预设。Kimi 作为一个 provider 展示,并提供 Coding Plan、API Key (China) 和 API Key (International) 三种接入方式;Xiaomi MiMo 作为一个 provider 展示,并提供按量付费以及中国、新加坡、欧洲 Token Plan endpoint。将 endpoint 级模型元数据贯通到 CLI、ACP、daemon/SDK、VS Code、Web Shell 和桌面端配置流程,确保每个选中的 endpoint 使用正确的默认模型和环境变量。第三方 provider 按显示名称的字典序排列,
/auth列表也会根据终端可用高度分页并显示滚动箭头。为什么需要
此前 Kimi 和 Xiaomi MiMo 必须通过 Custom Provider 重复配置,支持的 endpoint 和订阅专用 endpoint 也不容易发现。Kimi 的 Coding Plan 与区域 API 使用不同凭据和模型目录,因此扁平的单一模型列表会为部分 endpoint 安装无效模型。
加入这些 provider 后,列表高度也超过了弹窗。旧逻辑的上限是十个逻辑 item,但每个带描述的 item 会占多行终端空间,所以外层高度约束会裁剪内容,却不会触发列表分页。
Reviewer 测试计划
如何验证
/auth→ Third-party Providers。确认 provider 名称按字典序显示、DeepSeek 仍是第一项,并且列表超过可用高度时出现▲/▼。持续按 Down,确认 Kimi 和 Xiaomi MiMo 可以出现,底部提示不会被裁剪。k3-256k、k3、kimi-for-coding和kimi-for-coding-highspeed;两个 API 选项都应推荐kimi-k3、kimi-k2.7-code、kimi-k2.7-code-highspeed和kimi-k2.6。mimo-v2.5-pro和mimo-v2.5。自动验证:157 个 core provider 测试通过;core build 和 typecheck 通过;413 个相关 CLI 测试通过;10 个 VS Code auth handler 测试通过;SDK 和 VS Code typecheck 通过;所有变更文件通过 ESLint 和 Prettier。
证据(Before & After)
Before: Third-party Providers 中没有 Kimi 和 Xiaomi MiMo,必须通过 Custom Provider 配置。带描述的 provider 列表可能超过受约束的弹窗高度,但逻辑 item 数仍被判断为全部可容纳,导致后面的 provider 和底部提示被裁剪。
After: 在 macOS 的 100×24 终端中通过
npm run dev -- --screen-reader运行时,底部提示保持可见,按 Down 后两项 viewport 会持续移动:测试平台
环境(可选)
macOS、Node.js 24、
QWEN_SANDBOX=false,通过npm run dev -- --screen-reader运行源码 CLI,终端大小为 100×24。风险与范围
关联 Issue
无。